package main

import (
	"fmt"
)

func swap(a int, b int) {
	//go中的int类型是值传递
	c := a
	a = b
	b = c

}

func swap2(a *int, b *int) {
	//将指针的指向的实际值进行交换
	c := *a
	*a = *b
	*b = c

}

func main() {
	a := 10
	b := 20
	swap(a, b)
	fmt.Println(a, b)
	fmt.Printf("%p\n", &a) //变量有地址
	//现在有一种特殊的变量类型，这个变量只能保存地址值
	var ip *int //这个变量里面就只能保存地址类型这种值
	ip = &a     //取a的地址
	fmt.Println(ip)
	//如果要修改指针指向的变量的值，用法也比较特殊
	*ip = 30
	fmt.Println(a, b)
	swap2(&a, &b)
	fmt.Println(a, b)
	//指针还可以指向数据，指向数组的指针 指针是值类型
	arr := [3]int{1, 2, 3}
	var ip1 *[3]int = &arr
	var ptrs [3]*int //创建可以存放三个指针变量的数组
	//很多时候函数参数的时候指明的类型
	//指针的默认值是nil
	if ip1 != nil {
		fmt.Println(ip1)
	}
	fmt.Println(ptrs)
	//像python和java这种语言都是极力去屏蔽指针，c/c++都提供了指针，指针本身很强大
	//c和c++种指针的功能很强大，指针的转换 指针的偏移 指针的运算
	//go语言中没有屏蔽指针，但是go语言在指针上做了大量的限制，安全性提高很多，相比c和c++灵活性就降低了
	//指针变量中设计到两个符号 &和*

}
